#include <asm-generic/errno.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
#define int long long
signed main()
{
    int n = 0;
    cin >> n;
    vector<vector<int>> arr(n, vector<int>(2));
    int maxTime = 0;
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[i][0] >> arr[i][1];
        maxTime += arr[i][1];
    }
    auto cmp = [=](vector<int> arr1, vector<int> arr2)
    {
        if(arr1[0] < arr2[0])
            return true;
        else if(arr1[0] == arr2[0] && arr1[1] < arr2[1])
            return true;
        return false;
    };
    // sort(arr.begin(), arr.end(), cmp);
    sort(arr.begin(), arr.end()); // 不用自己写排序？确实，脑子瓦特了
    // for(int i = 0; i < n; ++i)
    // {
    //     cout << arr[i][0] << " " << arr[i][1] << endl;
    // }
    int res = 1;
    int last = arr[0][1];
    for(int i = 1; i < n; ++i)
    {
        if(arr[i][0] >= last) // 没有重叠
        {
            ++res;
            last = arr[i][1];
        }
        else // 有重叠 // 容易少这一句！！！！！！
        {
            last = min(last, arr[i][1]);
        }
    }
    cout << res << endl;
    // sort(arr.begin(), arr.end());
 
    // vector<vector<int>> dp(n + 1, vector<int>(maxTime));
    // // dp[i][j] 表示从1到i中选，活动时间不超过j的活动数？
    // int res = 0;
    // for(int i = 2; i <= n; ++i)
    // {
    //     for(int j = 0; j <= maxTime; ++j)
    //     {
    //         dp[i][j] = dp[i - 1][j]; // 不选
    //         if(j >= arr[i][1] && arr[i][0] >= arr[i - 1][1])
    //         {
    //             dp[i][j] = max(dp[i][j], dp[i][j - arr[i][1]] + 1); // 选
    //         }
    //         res = max(res, dp[i][j]);
    //     }
    // }
    // // cout << res << endl;
    // cout << 2 << endl;
    return 0;
}